import { dateUtil } from '@csii/vx-util';

// 转化日期为年月日...
const changeDateToText = function(date) {
  const dateType = date.match(/[yMwdhms]/)[0];
  switch (dateType) {
    case 'y':
      return {
        text: '年',
        value: 'year',
      };
    case 'M':
      return {
        text: '月',
        value: 'month',
      };
    case 'w':
      return {
        text: '周',
        value: 'week',
      };
    case 'd':
      return {
        text: '天',
        value: 'day',
      };
    case 'h':
      return {
        text: '小时',
        value: 'hour',
      };
    case 'm':
      return {
        text: '分钟',
        value: 'minute',
      };
    case 's':
      return {
        text: '秒',
        value: 'second',
      };
    default:
      return false;
  }
};

export default {
  // 金额弱校验方法
  weakMoneyRule: function(rule, value, callback) {
    let maxLength = 12;
    if (typeof value === 'object') {
      let { min = 0, max = 0 } = value;
      if (typeof value.max === 'string') {
        let len0 = value.max.split('.')[0].length;
        if (len0 > maxLength) {
          return callback(new Error('最大查询金额为999 999 999 999, 请在0-999 999 999 999范围内查询'));
        }
      }
      if (typeof value.min === 'string') {
        let len1 = value.min.split('.')[0].length;
        if (len1 > maxLength) {
          return callback(new Error('最大查询金额为999 999 999 999, 请在0-999 999 999 999范围内查询'));
        }
      }
      if (parseFloat(min) > parseFloat(max)) {
        return callback(new Error('终止金额应大于起始金额'));
      }
      return callback();
    }
  },
  // 金额校验方法
  moneyRule: function(rule, value, callback) {
    const prefix = rule.prefix || '金额';
    if (value == '' || value == null) {
      return callback(new Error(`请输入${prefix}`));
    } else {
      if (value === '0' || value === '0.0' || value === '0.00') {
        return callback(new Error(`${prefix}不能为0，请重新输入`));
      } else if (value.substr(0, 1) == '.') {
        return callback(new Error(`${prefix}不能够以.开头`));
      } else {
        return callback();
      }
    }
  },
  // 校验数字类型
  checkCountRule: function(rule, value, callback) {
    const prefix = rule.prefix || '此处';
    var regu = /^[1-9]\d*$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`${prefix}只能输入数字`));
      } else {
        return callback();
      }
    }
  },
  // 利率
  rateCountRule: function(rule, value, callback) {
    const prefix = rule.prefix || '利率';
    var regu = /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`${prefix}只能输入数字或小数`));
      } else {
        return callback();
      }
    }
  },
  // 校验手机号
  phoneRule: function(rule, value, callback) {
    const prefix = rule.prefix || '手机号码';
    var regu = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`${prefix}格式不正确`));
      } else {
        return callback();
      }
    } else {
      return callback();
    }
  },
  dateRangeRule: function(rule, value, callback) {
    const dateSpan = rule.dateSpan || null; // 时间跨度
    const dateSpanFix = rule.dateSpanFix; // 时间跨度 - 不符合的提示文字
    const dateRange = rule.dateRange || null; // 可以操作的最长时间
    const dateRangeFix = rule.dateRangeFix; // 可以操作的最长时间 - 不符合的提示文字
    if (value) {
      if (dateSpan) {
        if (!/^(-?\d+)([yMwdhms]s?)$/.test(dateSpan)) {
          callback(new Error(`请输入正确的时间跨度,详情请查看changeDate()方法`));
        } else {
          let span = parseInt(dateSpan.match(/-?\d+/g)[0] || 0);
          const spanText = changeDateToText(dateSpan)
            ? changeDateToText(dateSpan)
            : {
                text: '年',
                value: 'year',
              };
          if (span > 0) {
            if (dateUtil.daysBetween(value[1] || value, value[0] || new Date(), spanText.value) > span - 1) {
              if (dateSpanFix) {
                return callback(new Error(dateSpanFix));
              }
              return callback(new Error(`单次查询的时间跨度不得超过${span}个${spanText.text}`));
            }
          } else {
            span = 0 - span;
            if (dateUtil.daysBetween(value[1] || new Date(), value[0] || value, spanText.value) > span - 1) {
              if (dateSpanFix) {
                return callback(new Error(dateSpanFix));
              }
              return callback(new Error(`单次查询的时间跨度不得超过${span}个${spanText.text}`));
            }
          }
        }
      }
      if (dateRange) {
        if (!/^(-?\d+)([yMwdhms]s?)$/.test(dateRange)) {
          return callback(new Error('请输入正确的可操作时间长度, 详情请查看changeDate()方法'));
        } else {
          let range = parseInt(dateRange.match(/-?\d+/g)[0] || 0);
          const rangeText = changeDateToText(dateRange)
            ? changeDateToText(dateRange)
            : {
                text: '年',
                value: 'year',
              };
          if (range < 0) {
            range = 0 - range;
            if (dateUtil.daysBetween(new Date(), value[0], rangeText.value) > range - 1) {
              if (dateRangeFix) {
                return callback(new Error(dateRangeFix));
              }
              return callback(new Error(`系统可提供近${range}${rangeText.text}内的结果查询`));
            }
          } else {
            if (dateUtil.daysBetween(value[1], new Date(), rangeText.value) > range - 1) {
              if (dateRangeFix) {
                return callback(new Error(dateRangeFix));
              }
              return callback(new Error(`系统可提供近${range}${rangeText.text}内的结果查询`));
            }
          }
        }
      }
    }
    return callback();
  },
  /**
   * @description 金额范围检测
   * @param {*} rule
   * @param {*} value
   * @param {*} callback
   */
  moneyRangeRule: function(rule, value, callback) {
    const prefix = rule.prefix || '金额';
    let min = value.min;
    let max = value.max;
    // if(min.toString().length > 12) {
    //   return callback(new Error('您输入的金额超出范围!'));
    // }
    if (min && !max) {
      return callback(new Error(`终止${prefix}不能为空`));
    }
    if (!min && max) {
      return callback(new Error(`起始${prefix}不能为空`));
    }
    // TODO 待优化
    if (parseFloat(min) < 0 || parseFloat(max) > 99999999) {
      return callback(new Error(`您输入的${prefix}超出范围`));
    }
    if (parseFloat(max) < parseFloat(min)) {
      return callback(new Error(`您输入的${prefix}范围有误`));
    }
    return callback();
  },

  // 校验身份证号
  idCardRule: function(rule, value, callback) {
    const prefix = rule.prefix || '身份证号码';
    var regu = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`您输入的${prefix}格式不正确`));
      } else {
        return callback();
      }
    }
  },

  // 校验email
  emailRule: function(rule, value, callback) {
    const prefix = rule.prefix || 'e-mail';
    // const reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
    const reg = /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/;
    if (reg.test(value)) {
      callback();
    } else {
      return callback(new Error(`请输入正确的${prefix}`));
    }
  },
  // 金额不能超过100万校验
  maxNumRule: function(rule, value, callback) {
    const prefix = rule.prefix || '金额';
    let maxNum = Number('1000000');
    if (Number(value) > maxNum) {
      callback(new Error(`输入${prefix}不能大于100万`));
    } else {
      callback();
    }
  },
  // 收款方名称不能输入特殊字符
  payeeAcNameRule: function(rule, value, callback) {
    // eslint-disable-next-line no-useless-escape
    var iconRule = /[`~!@#$%^&*()_\+=<>?:"{}|,.\/:'\\[\].~！@#￥&*（）——、+={}|《》？：“”【】、；‘’，。、]/gi;
    if (iconRule.test(value)) {
      return callback(new Error(`${rule.prefix || '收款方名称'}不能输入特殊字符`));
    } else {
      callback();
    }
  },
  // 用途校验
  purposeRule: function(rule, value, callback) {
    const prefix = rule.prefix || '用途';
    if (value == '') {
      callback();
    } else {
      // eslint-disable-next-line no-unused-vars
      var len = 0;
      for (var i = 0; i < value.length; i++) {
        // 取出单个字符
        let c = value.charAt(i);
        // eslint-disable-next-line no-control-regex
        if (c.match(/[^\x00-\xff]/gi) != null) {
          len += 2;
        } else {
          return callback(new Error(`请输入${prefix}`));
        }
      }
    }
  },
  // 校验账号
  accountRule: function(rule, value, callback) {
    const prefix = rule.prefix || '账户';
    var regu = /^\d{16,}$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`您输入的${prefix}不正确`));
      } else {
        return callback();
      }
    } else {
      return callback(new Error(`请输入${prefix}`));
    }
  },
  // 校验6位数字
  verCodeRule: function(rule, value, callback) {
    const prefix = rule.prefix || '验证码';
    var regu = /^\d{6}$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`您输入的${prefix}不正确`));
      } else {
        return callback();
      }
    } else {
      return callback(new Error('请输入6位数字'));
    }
  },
  // 校验姓名
  nameRule: function(rule, value, callback) {
    const prefix = rule.prefix || '姓名';
    var regu = /^[\u4E00-\u9FA5]{2,6}$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`您输入的${prefix}格式不正确`));
      } else {
        return callback();
      }
    } else {
      return callback(new Error(`请输入${prefix}`));
    }
  },
  // 校验邮政编码
  postCodeRule: function(rule, value, callback) {
    const prefix = rule.prefix || '邮政编码';
    var regu = /^[0-9]{6}$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`您输入的${prefix}不正确`));
      } else {
        return callback();
      }
    } else {
      return callback(new Error(`请输入${prefix}`));
    }
  },
  // 校验别名（0-5）
  aliasRule: function(rule, value, callback) {
    var regu = /^[\u4E00-\u9FA5]{0,5}$/;
    if (value != '') {
      if (!regu.test(value)) {
        return callback(new Error(`您输入的${rule.prefix || '别名'}不正确`));
      } else {
        return callback();
      }
    } else {
      return callback(new Error(`请输入${rule.prefix || '别名'}`));
    }
  },
  // 校验承兑人名称不能包含“银行、储蓄、信用社、财务有限公司”字段
  validateacceptorName: function(rule, value, callback) {
    if (value == '' || value == null) {
      return callback(new Error('承兑人名称不能为空'));
    } else if (
      (value.indexOf('银行') != -1) |
      (value.indexOf('储蓄') != -1) |
      (value.indexOf('信用社') != -1) |
      (value.indexOf('财务有限公司') != -1)
    ) {
      return callback(new Error('不能包含“银行、储蓄、信用社、财务有限公司”字段'));
    } else {
      callback();
    }
  },
};
